﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;


//class Person
//{
//public:
//	void Print()
//	{
//		cout << "name:" << _name << endl;
//		cout << "age:" << _age << endl;
//	}
//	string _name = "peter"; // 姓名
//	int _age = 18; // 年龄
//};
//
//class Student : public Person
//{
//protected:
//	int _stuid; // 学号
//};
//
//class Teacher : public Person
//{
//protected:
//	int _jobid; // 工号
//};
//
//int main()
//{
//	Student s;
//	Teacher t;
//	s._age = 18;
//	s._name = "王伍";
//	s.Print();
//
//	t._age = 43;
//	t._name = "刘老师";
//	t.Print();
//	system("pause");
//	return 0;
//}


//class Base {
//public:
//    int publicMember;
//protected:
//    int protectedMember;
//private:
//    int privateMember;
//};
//
//class Derived : public Base {
//public:
//    void accessBaseMembers() {
//        publicMember = 1;       // 可以访问基类的公有成员
//        protectedMember = 2;    // 可以访问基类的保护成员
//        // privateMember = 3;   // 无法直接访问基类的私有成员
//    }
//};
//
//int main() {
//    Derived derivedObj;
//    derivedObj.publicMember = 1;        // 可以访问基类的公有成员
//    // derivedObj.protectedMember = 2;  // 无法直接访问基类的保护成员
//    // derivedObj.privateMember = 3;    // 无法直接访问基类的私有成员
//
//    return 0;
//}



//#include <iostream>
//
//class Base {
//public:
//    int publicMember;
//protected:
//    int protectedMember;
//private:
//    int privateMember;
//};
//
//class Derived : private Base {
//public:
//    void accessBaseMembers() {
//        publicMember = 1;       // 可以访问基类的公有成员
//        protectedMember = 2;    // 可以访问基类的保护成员
//        // privateMember = 3;   // 无法直接访问基类的私有成员
//    }
//};
//
//int main() {
//    Derived derivedObj;
//    // derivedObj.publicMember = 1;        // 无法直接访问基类的公有成员
//    // derivedObj.protectedMember = 2;     // 无法直接访问基类的保护成员
//    // derivedObj.privateMember = 3;       // 无法直接访问基类的私有成员
//
//    return 0;
//}


//
//class Base {
//public:
//    int publicMember;
//protected:
//    int protectedMember;
//private:
//    int privateMember;
//};
//
//class Derived : protected Base {
//public:
//    void accessBaseMembers() {
//        publicMember = 1;       // 可以访问基类的公有成员
//        protectedMember = 2;    // 可以访问基类的保护成员
//        // privateMember = 3;   // 无法直接访问基类的私有成员
//    }
//};
//
//int main() {
//    Derived derivedObj;
//    // derivedObj.publicMember = 1;        // 无法直接访问基类的公有成员
//    // derivedObj.protectedMember = 2;     // 无法直接访问基类的保护成员
//    // derivedObj.privateMember = 3;       // 无法直接访问基类的私有成员
//
//    return 0;
//}



//// Student的_num和Person的_num构成隐藏关系，可以看出这样代码虽然能跑，但是非常容易混淆
//class Person
//{
//protected:
//	string _name = "小李子"; // 姓名
//	int _num = 111; // 身份证号
//};
//class Student : public Person
//{
//public:
//	void Print()
//	{
//		cout << " 姓名:" << _name << endl;
//		cout << " 学号:" << _num << endl; //999 访问自己类的num
//
//		cout << " 身份证号:" << Person::_num << endl;  //111 访问基类的num
//	}
//protected:
//	int _num = 999; // 学号
//};
//
//int main()
//{
//	Student s1;
//	s1.Print();
//	system("pause");
//}




// 1、两个fun构成函数重载？ -- 不对 函数重载要求在同一作用域
// 2、两个fun构成隐藏  -- ok

class A
{
public:
	void fun()
	{
		cout << "func()" << endl;
	}
};

class B : public A
{
public:
	void fun(int i)
	{
		cout << "func(int i)->" << i << endl;
	}
};

int main()
{
	B b;
	b.fun(10);
	//b.fun(); //错误
	b.A::fun();
	return 0;
};